#!/bin/bash

# config
MAX_TEMP=40
# set column width
COLUMNS=2
# colors
white="\e[39m"
green="\e[1;32m"
red="\e[1;31m"
dim="\e[2m"
undim="\e[0m"

# disks to check
disks=(sda sdb sdc sdd sde sdf sdg sdi)
disknames=(sda sdb sdc sdd sde sdf sdg sdi)

# hddtemp
hddtemp_host=localhost
hddtemp_port=7634

# logfiles to check
logfiles='/var/log/syslog /var/log/syslog.1'

# get all lines with smartd entries from syslog
lines=$(tac $logfiles | grep -hiP 'smartd\[[[:digit:]]+\]:' | grep -iP "previous self-test")
# use nc to query temps from hddtemp daemon
hddtemp=$(timeout 0.01 nc $hddtemp_host $hddtemp_port | sed 's/|//m' | sed 's/||/ \n/g')

out=""
for i in "${!disks[@]}"; do
    disk=${disks[$i]}
    # use disknames if given
    diskname=${disknames[$i]}
    if [ -z "${diskname}" ]; then
        diskname=$disk
    fi
    uuid=$(blkid -s UUID -o value "/dev/${disk}")
    status=$( (grep "${uuid}" <<< "${lines}") | grep -m 1 -oP "previous self-test.*" | awk '{ print $4 " " $5 }')
    temp=$( (grep "${disk}" <<< "${hddtemp}") | awk -F'|' '{ print $3 }')

    # color green if temp <= MAX_TEMP, else red
    if [[ "${temp}" -gt "${MAX_TEMP}" ]]; then
        color=$red
    else
        color=$green
    fi
    # add "C" if temp is numeric
    if [[ "$temp" =~ ^[0-9]+$ ]]; then
        temp="${temp}C"
    fi
    # color green if status is "without error", else red
    if [[ "${status}" == "without error" ]]; then
        status_color=$green
    else
        status_color=$red
    fi

    # print temp & smartd error
    out+="${diskname}:,${color}${temp}${undim} | ${status_color}${status}${undim},"
    # insert \n every $COLUMNS column
    if [ $((($i+1) % $COLUMNS)) -eq 0 ]; then
        out+="\n"
    fi
done
out+="\n"

printf "\ndisk status:\n"
printf "$out" | column -ts $',' | sed -e 's/^/  /'
